#ifndef OJLB_OJ_COMMON_OJ_LOG_FILE_H_
#define OJLB_OJ_COMMON_OJ_LOG_FILE_H_
#include <memory>
#include <string>
#include <utility>
#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"
namespace ojlb {
namespace oj_common {


// 类定义
class OjLog {
public:
    // 不同等级的日志记录
    template <typename... Args>
    static void trace(const std::string &msg, Args&&... args) { logger->trace(msg, std::forward<Args>(args)...);} // 项目编写时排错颗粒度较小时使用(运行时关闭)
    template <typename... Args>
    static void debug(const std::string &msg, Args&&... args) { logger->debug(msg, std::forward<Args>(args)...);} // 项目编写时进行排错或查看时使用(运行时关闭)
    template <typename... Args>
    static void info(const std::string &msg, Args&&... args) { logger->info(msg, std::forward<Args>(args)...); } // 运行时正常的提示信息(运行时打开)
    template <typename... Args>
    static void warn(const std::string &msg, Args&&... args) { logger->warn(msg, std::forward<Args>(args)...); } // 运行时危险的提示消息(运行时打开)
    template <typename... Args>
    static void error(const std::string &msg, Args&&... args) { logger->error(msg, std::forward<Args>(args)...);} // 运行时错误的提示信息(运行时打开)

    // 屏蔽不同等级的日志
    static void setShieldLevel(const std::string &level);

private:
    // 私有构造函数和赋值操作符, 防止实例化
    OjLog() = default;
    OjLog(const OjLog &) = delete;
    OjLog &operator=(const OjLog &) = delete;

    // 定义静态单例对象
    static std::shared_ptr<spdlog::logger> logger;

    // 初始化静态成员变量方法
    static std::shared_ptr<spdlog::logger> initializeLogger();
}; // class OjLog end


} // namespace oj_common end
} // namespace ojlb end
#endif